#include "cpu/exec/template-start.h"

#define instr call   //instr = call

make_helper(concat(call_i_,SUFFIX)) { //i表示立即数，si表示有符号立即数
    //译码，根据SUFFIX，len=参数字节数
    int len = concat(decode_i_,SUFFIX)(cpu.eip + 1);//cpu.eip + 1为参数开始字节处
    //返回地址=下一条指令地址
    swaddr_t ret_addr = cpu.eip + 1 + len;
    //返回地址入栈
    cpu.esp -= 4;
    swaddr_write(cpu.esp,4,ret_addr);
    //偏移量
    DATA_TYPE_S pian_yi = op_src->val;
    //更新eip
    cpu.eip += pian_yi;
    //打印指令
    //print_asm_template1();
    print_asm("call: %x", cpu.eip + len + 1);
    //返回call指令总长度
    return len + 1;
}


make_helper(concat(call_rm_,SUFFIX)) { //i表示立即数，si表示有符号立即数
    //译码，根据SUFFIX，len=参数字节数
    int len = concat(decode_rm_,SUFFIX)(cpu.eip + 1);//cpu.eip + 1为参数开始字节处
    //返回地址=下一条指令地址
    swaddr_t ret_addr = cpu.eip + 1 + len;
    //返回地址入栈
    cpu.esp -= 4;
    swaddr_write(cpu.esp,4,ret_addr);
    //更新eip
    cpu.eip = op_src->val - len - 1;
    //打印指令
    //print_asm_template1();
    print_asm("call *%s", op_src->str);
    //返回call指令总长度
    return len + 1;
}

#include "cpu/exec/template-end.h"
